local voucherId = ARGV[1]
local userId = ARGV[2]
local orderId = ARGV[3]

-- 库存key
local stockKey = "seckill:stock:" .. voucherId
local orderKey = "seckill:order:" .. userId

-- 获取库存，不存在时默认0
local stock = tonumber(redis.call('get', stockKey) or 0)

-- 检查库存是否充足
if stock <= 0 then
    return 1
end

-- 判断用户是否已下单，注意修正了方法名
if redis.call('sismember', orderKey, userId) == 1 then
    return 2
end

-- 预扣库存，使用原子操作
local newStock = redis.call('incrby', stockKey, -1)

-- 检查扣减后库存是否有效
if newStock < 0 then
    -- 库存不足，回滚操作
    redis.call('incrby', stockKey, 1)
    return 1
end

-- 保存用户订单信息
redis.call('sadd', orderKey, userId)

-- 发送消息到队列
redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)

return 0 -- 成功